package com.wlc.base.sorting;

import java.util.Arrays;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 选择排序
 * @date 2021-07-18 18:16
 */
public class SelectSortDemo {

    public void method04() {
        int[] a = {23, 4, 56, 7, 7, 9};
        //lambda 表达式for循环
        Arrays.stream(a).forEach(e -> {
            System.out.print(" " + e);
        });
        System.out.println("下面的这种是lambda表达式比较简单");

        Arrays.stream(a).forEach(System.out::print);
    }

    /**
     * 选择法排序的思路：
     * 把第一位和其他所有的进行比较，只要比第一位小的，就换到第一个位置来
     * 比较完后，第一位就是最小的
     * 然后再从第二位和剩余的其他所有进行比较，只要比第二位小，就换到第二个位置来
     * 比较完后，第二位就是第二小的
     * 以此类推
     */
    public void method01() {
        int a[] = new int[]{18, 62, 68, 82, 65, 9};
        //排序前，先把内容打印出来
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println(" ");
        //选择法排序

        //第一步： 把第一位和其他所有位进行比较
        //如果发现其他位置的数据比第一位小，就进行交换
        for (int i = 1; i < a.length; i++) {
            if (a[i] < a[0]) {
                int temp = a[0];
                a[0] = a[i];
                a[i] = temp;
            }
        }
        //把内容打印出来
        //可以发现，最小的一个数，到了最前面
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println(" ");

        //第二步： 把第二位的和剩下的所有位进行比较
        for (int i = 2; i < a.length; i++) {
            if (a[i] < a[1]) {
                int temp = a[1];
                a[1] = a[i];
                a[i] = temp;
            }
        }
        //把内容打印出来
        //可以发现，倒数第二小的数，到了第二个位置
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println(" ");

        //可以发现一个规律
        //移动的位置是从0 逐渐增加的
        //所以可以在外面套一层循环

        for (int j = 0; j < a.length - 1; j++) {
            for (int i = j + 1; i < a.length; i++) {
                if (a[i] < a[j]) {
                    int temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                }
            }
        }

        //把内容打印出来
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println(" ");
    }

    public void method02() {
        int[] a = {34, 52, 23, 45, 67};
        int[] b = new int[10];
        b[0] = 2;
        for (int i : b) {
            System.out.print(" " + i);
        }
        System.out.println("");
        // 复制数组
        // src: 要复制的数据源
        // srcPos: 从源数组复制的起始位置
        // destPos: 复制到目标数组的起始位置
        // length ：要复制的长度
        System.arraycopy(a, 0, b, 2, 2);
        System.out.println("复制后b的数组为：");
        for (int i : b) {
            System.out.print(i + " ");
        }
    }

    /**
     * 把数组a的值 和 数组b的值复制到数组c中
     */
    public void method03() {
        int[] a = {45, 23, 13};
        int[] b = {1, 2, 11, 91};
        // 数组的总长度
        int length = a.length + b.length;
        int[] c = new int[length];
        System.arraycopy(a, 0, c, 0, a.length);
        System.arraycopy(b, 0, c, a.length, b.length);
        for (int i : c) {
            System.out.print(i + " ");
        }
    }

    public void print(String msg, int[] n) {
        System.out.println(msg + "数组为：");
        for (int i : n) {
            System.out.print(i + " ");
        }
        System.out.println();
    }

    /**
     * 选择排序  需要比较   (n-1) * (n-1)  次数
     * 第一个和第 2，3，4，5...n个比较
     * 第2个和第 3，4，5...n个比较
     */
    public void selectSort() {
        // 初始化一个数组
        int[] n = {12, 2, 6, 1, 0, 6};
        print("初始化后", n);
        // 第一个数组和第2个，第3个，。。。第n个数字进行比较
        for (int i = 1; i < n.length; i++) {
            if (n[1] < n[0]) {
                // 第二个数字比第一个数字小
                int temp = n[1];
                n[1] = n[0];
                n[0] = temp;
            }
        }
        print("第一次排序", n);
        // 第2个数字和第3，4，5，。。n个数字进行比较
        for (int i = 2; i < n.length; i++) {
            if (n[2] < n[1]) {
                // 第3个比第1个小
                int temp = n[2];
                n[2] = n[1];
                n[1] = temp;
            }
        }
        print("第2次排序", n);

        int total = 0;
        for (int i = 1; i < n.length; i++) {
            for (int j = 0; j < n.length - 1; j++) {
                //  如果  n[1] < n[0]   第2个数字 < 第1个数字   n[1] = 2  n[0] = 5
                //  则 n[0] = 2; n[1] = 5
                if (n[i] < n[j]) {
                    int temp = n[i];
                    n[i] = n[j];
                    n[j] = temp;
                }
                total++;
            }
        }
        print("排序后", n);
        System.out.println("共比较了" + total + "次");
    }

    public static void main(String[] args) {
        new SelectSortDemo().selectSort();
    }
}
